package com.hospital.workstation.utils;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.hospital.common.utils.StringUtils;
import com.hospital.workstation.domain.*;
import com.hospital.workstation.domain.vo.FirstLevelVo;
import com.hospital.workstation.domain.vo.PatientBaseInfoVo;
import com.hospital.workstation.domain.vo.TwoLevelVo;
import org.springframework.boot.web.embedded.tomcat.TomcatWebServer;

/**
 * @ClassName CareLevelUtil
 * @description: 监护级别判断工具类
 * @author: whb
 * @create: 2023-04-19 11:41
 * @Version 1.0
 **/
public class CareLevelUtil {
    /**
     * 判断患者否是属于一级药学监护级别
     *
     * @param patientBaseInfo 患者基本信息实体对象
     * @param firstLevel      一级监护实体对象
     * @return
     */
    public static boolean isFirstCareLevel(PatientBaseInfo patientBaseInfo, FirstLevel firstLevel) {
        int i = 0;
        /**
         * 严重肾功能不全（Clcr≤30ml/min）
         * 成年男性：Clcr=（140-年龄）×体重/（72×cr）
         * 成年女性＝男性×0.85
         */
        if (patientBaseInfo.getPatientAge() >= 18
            && ObjectUtil.isNotNull(patientBaseInfo.getPatientWeight())
            && StringUtils.isNotBlank(firstLevel.getRenalFunction())) {
            // 计算Clcr值
            double clcr = (140 - patientBaseInfo.getPatientAge()) * patientBaseInfo.getPatientWeight().intValue() / (72 * Double.parseDouble(firstLevel.getRenalFunction()));
            // 判断性别
            if ("2".equals(patientBaseInfo.getPatientSex())) { // 女性
                clcr = clcr * 0.85;
            }
            // 严重肾功能不全
            if (clcr <= 30) {
                i++;
            }
        }
        // 血液透析
        if ("1".equals(firstLevel.getBloodDialysis())) {
            i++;
        }
        // 血液滤过
        if ("1".equals(firstLevel.getHemofiltration())) {
            i++;
        }
        // 血浆置换
        if ("1".equals(firstLevel.getBloodReplacement())) {
            i++;
        }
        // 血液灌流
        if ("1".equals(firstLevel.getBloodPerfusion())) {
            i++;
        }
        // 体外膜肺氧合
        if ("1".equals(firstLevel.getExtracorporeal())) {
            i++;
        }
        // ALT＞5
        String altValue = firstLevel.getAltValue();
        if (StringUtils.isNotBlank(altValue)) {
            // 严重
            if (Double.parseDouble(altValue) > 5) {
                i++;
            }
        }
        // AST>5
        String astValue = firstLevel.getAstValue();
        if (StringUtils.isNotBlank(astValue)) {
            // 严重
            if (Double.parseDouble(astValue) > 5) {
                i++;
            }
        }
        // ALP＞5
        String alpValue = firstLevel.getAlpValue();
        if (StringUtils.isNotBlank(alpValue)) {
            // 严重
            if (Double.parseDouble(alpValue) > 5) {
                i++;
            }
        }
        // T-BiL＞3
        String tbilValue = firstLevel.getTbil();
        if (StringUtils.isNotBlank(tbilValue)) {
            // 严重
            if (Double.parseDouble(tbilValue) > 3) {
                i++;
            }
        }
        // 肝功能 CTP评分≥10 分
        if ("1".equals(firstLevel.getCtpValue())) {
            i++;
        }
        // 同时伴有中度肾功能不全和中度肝功能不全
        if ("1".equals(firstLevel.getBothValue())) {
            i++;
        }
        // 出现休克
        if ("1".equals(firstLevel.getShowShock())) {
            i++;
        }
        // 动脉血气检查分析
        if ("1".equals(firstLevel.getArteryBloodCheck())) {
            i++;
        }
        // 血浆NT-proBNP
        if ("1".equals(firstLevel.getNtProBnp())) {
            i++;
        }
        // 外周血 cTnT
        if ("1".equals(firstLevel.getCtNt())) {
            i++;
        }
        // 凝血酶原时间
        if ("1".equals(firstLevel.getBloodClotting())) {
            i++;
        }
        // 用药超过15种
        if ("1".equals(firstLevel.getPillsCount())) {
            i++;
        }
        // 联合应用≥3种抗肿瘤药物
        if ("1".equals(firstLevel.getUnionAntineoplastic())) {
            i++;
        }
        // 3 日内接受溶栓治疗
        if ("1".equals(firstLevel.getThrombolyticTherapy())) {
            i++;
        }
        // 血药浓度监测值异常或出现严重
        if ("1".equals(firstLevel.getAdrAde())) {
            i++;
        }
        // 特殊使用级抗菌药物值（待定）
        // 使用大毒中药饮片
        if ("1".equals(firstLevel.getExtremelyPoisonousDrugs())) {
            i++;
        }
        // 使用 A 级高警示药品值（待定）
        // 护理级别为特级护理患者（待定）
        // 患有两种以上医保目录报销的慢性病
        if ("1".equals(firstLevel.getTwoChronicDisease())) {
            i++;
        }
        return i > 0 ? true : false;
    }

    /**
     * 是否属于一级药学监护分级
     *
     * @param gradingFirst 一级监护分级实体对象
     * @return
     */
    public static boolean isFirstGrading(GradingFirst gradingFirst) {
        int i = 0;
        // 第一项
        if ("1".equals(gradingFirst.getItemOne())) {
            i++;
        }
        // 第二项
        if ("1".equals(gradingFirst.getItemTwo())) {
            i++;
        }
        // 第三项
        if ("1".equals(gradingFirst.getItemThree())) {
            i++;
        }
        // 第四项
        if ("1".equals(gradingFirst.getItemFour())) {
            i++;
        }
        // 第五项
        if ("1".equals(gradingFirst.getItemFive())) {
            i++;
        }
        // 第六项
        if ("1".equals(gradingFirst.getItemSix())) {
            i++;
        }
        // 第七项
        if ("1".equals(gradingFirst.getItemSeven())) {
            i++;
        }
        // 第八项
        if ("1".equals(gradingFirst.getItemEight())) {
            i++;
        }
        // 第九项
        if ("1".equals(gradingFirst.getItemNine())) {
            i++;
        }
        // 第十项
        if ("1".equals(gradingFirst.getItemTen())) {
            i++;
        }
        // 第十一项
        if ("1".equals(gradingFirst.getItemEleven())) {
            i++;
        }
        // 第十二项
        if ("1".equals(gradingFirst.getItemTwelve())) {
            i++;
        }
        // 第十三项
        if ("1".equals(gradingFirst.getItemThirteen())) {
            i++;
        }
        // 第十四项
        if ("1".equals(gradingFirst.getItemFourteen())) {
            i++;
        }
        // 第十五项
        if ("1".equals(gradingFirst.getItemFifteen())) {
            i++;
        }
        // 第十六项
        if ("1".equals(gradingFirst.getItemSixteen())) {
            i++;
        }
        // 第十七项
        if ("1".equals(gradingFirst.getItemSeventeen())) {
            i++;
        }
        // 第十八项
        if ("1".equals(gradingFirst.getItemEighteen())) {
            i++;
        }
        return i > 0 ? true : false;
    }

    /**
     * 判断患者是否属于二级药学监护级别
     *
     * @param patientBaseInfo 患者基本信息实体对象
     * @param twoLevel        二级监护实体对象
     * @return
     */
    public static boolean isTwoCareLevel(PatientBaseInfo patientBaseInfo, TwoLevel twoLevel) {
        int i = 0;
        /**
         * 中度肾功能不全（30ml/min＜Clcr≤60ml/min）
         * 成年男性：Clcr=（140-年龄）×体重/（72×cr）
         * 成年女性＝男性×0.85
         */
        if (patientBaseInfo.getPatientAge() >= 18
            && ObjectUtil.isNotNull(patientBaseInfo.getPatientWeight())
            && StringUtils.isNotBlank(twoLevel.getModerateRenalFunction())) {
            // 计算Clcr值
            double clcr = (140 - patientBaseInfo.getPatientAge()) * patientBaseInfo.getPatientWeight().intValue() / (72 * Double.parseDouble(twoLevel.getModerateRenalFunction()));
            // 判断性别
            if ("2".equals(patientBaseInfo.getPatientSex())) { // 女性
                clcr = clcr * 0.85;
            }
            // 中度肾功能不全
            if (clcr > 30 && clcr <= 60) {
                i++;
            }
        }
        // ALT>2 and ALT<=4
        String altValue = twoLevel.getAltValue();
        if (StringUtils.isNotBlank(altValue)) {
            if (Double.parseDouble(altValue) > 2 && Double.parseDouble(altValue) <= 4) {
                i++;
            }
        }
        // AST>2 and AST<=4
        String astValue = twoLevel.getAstValue();
        if (StringUtils.isNotBlank(astValue)) {
            if (Double.parseDouble(astValue) > 2 && Double.parseDouble(astValue) <= 4) {
                i++;
            }
        }
        // ALP>2 and ALP<=4
        String alpValue = twoLevel.getAlpValue();
        if (StringUtils.isNotBlank(alpValue)) {
            if (Double.parseDouble(alpValue) > 2 && Double.parseDouble(alpValue) <= 4) {
                i++;
            }
        }
        // T-BiL>2 and T-BiL<=3
        String tbilValue = twoLevel.getTbil();
        if (StringUtils.isNotBlank(tbilValue)) {
            if (Double.parseDouble(tbilValue) > 2 && Double.parseDouble(tbilValue) <= 3) {
                i++;
            }
        }
        // 肝功能 CTP评分>7 and <=9 分
        if ("1".equals(twoLevel.getCtpValue())) {
            i++;
        }
        // 非儿科的患儿（＜14 岁） 、高龄（＞75 岁）及非产科、生殖医学科妊娠期患者
        if ("1".equals(twoLevel.getIsChild())) {
            i++;
        }
        // 有既往药物过敏史
        if ("1".equals(twoLevel.getIsHistoryAllergy())) {
            i++;
        }
        // 同时应用药物超过 10 种或同时使用 2 种有明确相互作用药物的患者
        if ("1".equals(twoLevel.getIsSimultaneously())) {
            i++;
        }
        // 静脉使用氨基苷类抗菌药物的患者
        if ("1".equals(twoLevel.getIsVenousAntisepsis())) {
            i++;
        }
        // 存在抗菌药物不良反应高危因素者（凝血功能异常、中枢神经系统损伤）
        if ("1".equals(twoLevel.getIsBadAntisepsis())) {
            i++;
        }
        // 联合使用 3 种以上抗菌药物
        if ("1".equals(twoLevel.getUnionThreeAntisepsis())) {
            i++;
        }
        // 使用 B 级高警示药品值（待定）
        // 使用有毒中药饮片的患者
        if ("1".equals(twoLevel.getExtremelyPoisonousDrugs())) {
            i++;
        }
        // 接受静脉输液泵入给药、经胃食管给药患者
        if ("1".equals(twoLevel.getIsVenousTransfusion())) {
            i++;
        }
        //  护理级别为一级护理患者（待定）
        // 患有一种国家医保或各省、市、自治区医保目录报销的慢病
        if ("1".equals(twoLevel.getOneChronicDisease())) {
            i++;
        }
        return i > 0 ? true : false;
    }

    /**
     * 是否属于二级药学监护分级
     *
     * @param gradingTwo 二级监护分级信息实体对象
     * @return
     */
    public static boolean isTwoGrading(GradingTwo gradingTwo) {
        int i = 0;
// 第一项
        if ("1".equals(gradingTwo.getItemOne())) {
            i++;
        }
        // 第二项
        if ("1".equals(gradingTwo.getItemTwo())) {
            i++;
        }
        // 第三项
        if ("1".equals(gradingTwo.getItemThree())) {
            i++;
        }
        // 第四项
        if ("1".equals(gradingTwo.getItemFour())) {
            i++;
        }
        // 第五项
        if ("1".equals(gradingTwo.getItemFive())) {
            i++;
        }
        // 第六项
        if ("1".equals(gradingTwo.getItemSix())) {
            i++;
        }
        // 第七项
        if ("1".equals(gradingTwo.getItemSeven())) {
            i++;
        }
        // 第八项
        if ("1".equals(gradingTwo.getItemEight())) {
            i++;
        }
        // 第九项
        if ("1".equals(gradingTwo.getItemNine())) {
            i++;
        }
        // 第十项
        if ("1".equals(gradingTwo.getItemTen())) {
            i++;
        }
        // 第十一项
        if ("1".equals(gradingTwo.getItemEleven())) {
            i++;
        }
        // 第十二项
        if ("1".equals(gradingTwo.getItemTwelve())) {
            i++;
        }
        // 第十三项
        if ("1".equals(gradingTwo.getItemThirteen())) {
            i++;
        }
        return i > 0 ? true : false;
    }

    /**
     * 一级监护触发项
     *
     * @param patientBaseInfo 患者基本信息实体对象
     * @param firstLevelVo    一级监护信息视图对象
     * @return
     */
    public static FirstLevelVo getFirstLevelVo(PatientBaseInfo patientBaseInfo, FirstLevelVo firstLevelVo) {
        // 判断是否属于一级监护分级
        boolean isFirst = isFirstCareLevel(patientBaseInfo, BeanUtil.toBean(firstLevelVo, FirstLevel.class));

        /**
         * 严重肾功能不全（Clcr≤30ml/min）
         * 成年男性：Clcr=（140-年龄）×体重/（72×cr）
         * 成年女性＝男性×0.85
         */
        if (patientBaseInfo.getPatientAge() >= 18
            && ObjectUtil.isNotNull(patientBaseInfo.getPatientWeight())
            && StringUtils.isNotBlank(firstLevelVo.getRenalFunction())) {
            // 计算Clcr值
            double clcr = (140 - patientBaseInfo.getPatientAge()) * patientBaseInfo.getPatientWeight().intValue() / (72 * Double.parseDouble(firstLevelVo.getRenalFunction()));
            // 判断性别
            if ("2".equals(patientBaseInfo.getPatientSex())) { // 女性
                clcr = clcr * 0.85;
            }
            // 严重肾功能不全
            if (clcr <= 30) {
                firstLevelVo.setIsRenalFunction("1");
            }
        }
        // ALT＞5
        String altValue = firstLevelVo.getAltValue();
        if (StringUtils.isNotBlank(altValue)) {
            // 严重
            if (Double.parseDouble(altValue) > 5) {
                firstLevelVo.setIsAlt("1");
            }
        }
        // AST>5
        String astValue = firstLevelVo.getAstValue();
        if (StringUtils.isNotBlank(astValue)) {
            // 严重
            if (Double.parseDouble(astValue) > 5) {
                firstLevelVo.setIsAst("1");
            }
        }
        // ALP＞5
        String alpValue = firstLevelVo.getAlpValue();
        if (StringUtils.isNotBlank(alpValue)) {
            // 严重
            if (Double.parseDouble(alpValue) > 5) {
                firstLevelVo.setIsAlp("1");
            }
        }
        // T-BiL＞3
        String tbilValue = firstLevelVo.getTbil();
        if (StringUtils.isNotBlank(tbilValue)) {
            // 严重
            if (Double.parseDouble(tbilValue) > 3) {
                firstLevelVo.setIsTbil("1");
            }
        }
        // 使用 A 级高警示药品值（待定）
        // 护理级别为特级护理患者（待定）

        return isFirst ? firstLevelVo : null;
    }

    /**
     * 二级监护触发项
     *
     * @param patientBaseInfo 患者基本信息实体对象
     * @param twoLevelVo      二级监护信息视图对象
     * @return
     */
    public static TwoLevelVo getTwoLevelVo(PatientBaseInfo patientBaseInfo, TwoLevelVo twoLevelVo) {
        // 判断是否属于二级监护分级
        boolean isTwo = isTwoCareLevel(patientBaseInfo, BeanUtil.toBean(twoLevelVo, TwoLevel.class));

        /**
         * 中度肾功能不全（30ml/min＜Clcr≤60ml/min）
         * 成年男性：Clcr=（140-年龄）×体重/（72×cr）
         * 成年女性＝男性×0.85
         */
        if (patientBaseInfo.getPatientAge() >= 18
            && ObjectUtil.isNotNull(patientBaseInfo.getPatientWeight())
            && StringUtils.isNotBlank(twoLevelVo.getModerateRenalFunction())) {
            // 计算Clcr值
            double clcr = (140 - patientBaseInfo.getPatientAge()) * patientBaseInfo.getPatientWeight().intValue() / (72 * Double.parseDouble(twoLevelVo.getModerateRenalFunction()));
            // 判断性别
            if ("2".equals(patientBaseInfo.getPatientSex())) { // 女性
                clcr = clcr * 0.85;
            }
            // 中度肾功能不全
            if (clcr > 30 && clcr <= 60) {
                twoLevelVo.setIsModerateRenalFunction("1");
            }
        }
        // ALT>2 and ALT<=4
        String altValue = twoLevelVo.getAltValue();
        if (StringUtils.isNotBlank(altValue)) {
            if (Double.parseDouble(altValue) > 2 && Double.parseDouble(altValue) <= 4) {
                twoLevelVo.setIsAlpValue("1");
            }
        }
        // AST>2 and AST<=4
        String astValue = twoLevelVo.getAstValue();
        if (StringUtils.isNotBlank(astValue)) {
            if (Double.parseDouble(astValue) > 2 && Double.parseDouble(astValue) <= 4) {
                twoLevelVo.setIsAstValue("1");
            }
        }
        // ALP>2 and ALP<=4
        String alpValue = twoLevelVo.getAlpValue();
        if (StringUtils.isNotBlank(alpValue)) {
            if (Double.parseDouble(alpValue) > 2 && Double.parseDouble(alpValue) <= 4) {
                twoLevelVo.setIsAlpValue("1");
            }
        }
        // T-BiL>2 and T-BiL<=3
        String tbilValue = twoLevelVo.getTbil();
        if (StringUtils.isNotBlank(tbilValue)) {
            if (Double.parseDouble(tbilValue) > 2 && Double.parseDouble(tbilValue) <= 3) {
                twoLevelVo.setIsTbil("1");
            }
        }
        // 使用 B 级高警示药品值（待定）
        // 护理级别为一级护理患者（待定）

        return isTwo ? twoLevelVo : null;
    }
}
